lexer grammar YACCLexer;

options {
  language = Java;
}

@rulecatch {catch (RecognitionException e) {
  throw e;}
 }

@header {
package PL.prac7;
}

WHILE: 'while';
IF: 'if';
ELSE: 'else';
VOID: 'void';
BREAK: 'break';
FOR: 'for';
MAIN: 'main';
DEFINE: 'define';
INCLUDE: 'include';
EXTERN: 'extern';
TYPEDEF: 'typedef';
STRUCT: 'struct';
RETURN: 'return';
fragment INT: 'int';
fragment CHAR: 'char';
fragment FLOAT: 'float';
fragment DOUBLE: 'double';
TIPO: (INT | CHAR | FLOAT | DOUBLE);
ALLAVE: '{';
CLLAVE: '}';
APARENTESIS: '(';
CPARENTESIS: ')';
ACORCHETE: '[';
CCORCHETE: ']';
MAYOR: '>';
MENOR: '<';
IGUAL: ('=');
MAS: '+';
MENOS: '-';
ASTERISCO: '*';
AND: '&&';
ORYACC: '|';
OR: '||';
NOT: '!';
INTERROGANTE: '?';
DOSPUNTOS: ':';
BARRA: '/';
SEPARADOR: ';';
COMA: ',';
PUNTO: '.';
ALMOHADILLA: ' #';
PORCENTAJE: '%';
INIDEFINICIONES: '%{';
FINDEFINICIONES: '%}';
ZONAREGLA: '%%';

fragment LETRA : ('a'..'z')| ('A'..'Z')|'_'; 
  IDENT: LETRA (DIGITO|LETRA)*;
fragment DIGITO : '0'..'9'; 
  NUMERO : MENOS? (DIGITO)+ (PUNTO DIGITO*)?;

fragment DOLAR: '$';
VAR : DOLAR DIGITO;
DOLARDOLAR: DOLAR DOLAR;
fragment COMILLAS: '"';
CADENA: COMILLAS (~(COMILLAS))* COMILLAS;

fragment COMILLA: '\'';
CARACTER: COMILLA (.)* COMILLA;

fragment ESPACIO: (' ');
  fragment NUEVA_LINEA: ('\r\n'|'\n');
    BLANCO: (ESPACIO|'\t'|'\r'|NUEVA_LINEA) {$channel = HIDDEN;}; 
  COMENTARIO: '/*' (options {greedy=false;}:.)* '*/'{$channel = HIDDEN;};